#!/usr/bin/python
# -*-coding:UTF-8 -*-

# ========================
# @Time  : 2021-01-24
# @Author: Sunny
# ========================


"""
生成器：它是一种特殊的迭代器(生成器内部保存的是生成数据的规则规律)
       生成器比迭代器更高级，生成器可以用next()


创建生成器的2种方式：
1.生成器表达式
2.生成器函数:只要函数中使用了yield关键字，那么这个函数就是一个生成器函数
"""

#生成器的创建有2种方式
#1.生成器表达式(没有元组表达式，返回的式生成器对象generator)
tu = (i for i in range(10))
print(tu)
#生成器也可以用next()函数迭代取值
print(next(tu))
print(next(tu))


#2.生成器函数yield
def gen():
    print('-------1--------')
    for i in range(10):
        yield i
        # yield {'a':i}
        print('------2------')

# （print的值无法打印了，因为用了yield，返回的是生成器对象）
# print(gen())

#可打断点调试
g = gen()

#可通过next()方法，依次生成数据返回
#每次生成数据后，yield会返回生成的函数值，且跳出函数，下次生成时，再原来的代码基础上继续忘下执行
#当yield后为空，则迭代的返回值为None
#当生成器与迭代器一样，当超出规则无法再生成新数据时，会抛出异常
print('第1次生成数据：',next(g))
print('第2次生成数据：',next(g))
print('第3次生成数据：',next(g))
print('第4次生成数据：',next(g))
# print('第5次生成数据：',next(g))
# print('第6次生成数据：',next(g))
# print('第7次生成数据：',next(g))
# print('第8次生成数据：',next(g))
# print('第9次生成数据：',next(g))
# print('第10次生成数据：',next(g))
# print('第11次生成数据：',next(g))

